<?php

class Dao_BasesModel extends DB_Base
{
    private $_redisTool;

    const STATUS = 0;
    const NOT_STATUS = 1;
    const EXTIME = '86400';
    const INFO_CACHE_KEY = '_TABLE_INFO_CACHE_KEY_';

    public function __construct()
    {/*{{{*/

        $this->_redisTool = RedisTool::getInstance();
        parent::__construct();
    }/*}}}*/

    /**
     * @return mixed
     * 获取项目的redis缓存前缀
     */
    private function getRedisPerfix ()
    {
        $_config = Yaf_Registry::get ( 'config' )->database->redis->toArray ();
        $prefix  = $_config[ 'prefix' ];
        return $prefix;
    }

    /**
     * 获得cache key.
     * @return string
     */
    private function getCacheKey()
    {/*{{{*/
        return strtoupper($this->getRedisPerfix()) . strtoupper($this->_table) . self::INFO_CACHE_KEY;
    }/*}}}*/

    /**
     * 通过$id获取cache key.
     * @param int $id
     * @return string
     */
    private function _getCacheKeyById($id)
    {/*{{{*/
        return self::getCacheKey() . $id;
    }/*}}}*/

    /**
     * 通过$id取缓存.
     * @param int $id
     * @return bool|mixed
     */
    public function getCacheById($id)
    {/*{{{*/
        $key = self::_getCacheKeyById($id);
        $t = $this->_redisTool->get($key);
        $t = $t ? json_decode($t, true) : false;
        return $t;
    }/*}}}*/

    /**
     * 通过$id设置缓存.
     * @param $id
     * @param array $info
     * @return mixed
     */
    private function setCacheById($id, $info)
    {/*{{{*/
        $key = self::_getCacheKeyById($id);
        return $this->_redisTool->set($key, json_encode($info), self::EXTIME);
    }/*}}}*/

    /**
     * 删除缓存.
     * @param int $id
     * @return mixed
     */
    private function deleteCacheById($id)
    {/*{{{*/
        $key = self::_getCacheKeyById($id);
        return $this->_redisTool->delete($key);
    }/*}}}*/

    /**
     * 获取信息.
     * @param int $id
     * @param bool $needCache 是否需要缓存
     * @return array|bool
     */
    public function getInfo($id = 0, $needCache = true)
    {/*{{{*/
        $info = $this->getCacheById($id);
        if ($info && $needCache) return $info;
        $info = parent::find($id);
        if ($info) $this->setCacheById($id, $info);
        return $info;
    }/*}}}*/

    /**
     * 取一批人的信息.
     * @param array $ids
     * @return array
     */
    public function getByids(Array $ids = array())
    {/*{{{*/
        if (empty($ids)) return array();
        $ids = array_map(function ($id) {
            return intval($id);
        }, array_unique($ids));

        $caches = $this->getFromCache($ids);
        $cacheIds = array_keys($caches);
        $ids = array_diff($ids, $cacheIds);
        if (empty($ids)) return array_values($caches);

        $where = array();
        $where[] = array('id', $ids);
        $infos = parent::getRows(array('*'), $where);

        if (!$infos) {
            $res = $caches ? array_values($caches) : array();
        } else {
            foreach ($infos as $info) {
                $this->setCacheById($info['id'], $info);
            }
            $res = array_merge($infos, $caches ? array_values($caches) : array());
        }
        return $res;
    }/*}}}*/

    /**
     * 从缓存中取信息.
     * @param array $ids
     * @return array
     */
    private function getFromCache(Array $ids)
    {/*{{{*/
        if (empty($ids)) return array();
        $key = self::getCacheKey();
        $keys = array_map(function ($id) use ($key) {
            return $key . $id;
        }, array_unique($ids));

        $infos = $this->_redisTool->mget($keys);
        if ($infos) {
            foreach ($infos as &$info) {
                if (!$info || in_array($info, array("null", "NULL"))) continue;
                $info = json_decode($info, true);
                $ret[$info['id']] = $info;
            }
        }
        return isset($ret) ? $ret : array();
    }/*}}}*/

    /**
     * 添加信息
     * @param $data
     * @return array|bool|string
     */
    public function addInfo($data)
    {/*{{{*/
        return parent::add($data);
    }/*}}}*/

    /**
     * 更新信息
     * @param array $info
     * @param $id
     * @return array|bool|string
     */
    public function editInfo(Array $info, $id)
    {/*{{{*/
        $cond = array(array('id', $id));
        $this->deleteCacheById($id);
        return $ret = $this->edit($info, $cond);
    }/*}}}*/

    /**
     * 删除信息
     * @param $id
     * @return array|bool|string
     */
    public function delInfo($id)
    {/*{{{*/
        $cond = array(array('id', $id));
        $this->deleteCacheById($id);
        return $this->del($cond);
    }/*}}}*/


}
